import request from "@/utils/request";

const PROJECT_BASE_URL = "/bus/project";

class ProjectAPI {
  /** 项目暂存接口*/
  static save(data: ProjectData) {
    return request({
      url: `${PROJECT_BASE_URL}/save`,
      method: "post",
      data: data,
    });
  }

  /** 项目发起接口*/
  static apply(data: ProjectData) {
    return request({
      url: `${PROJECT_BASE_URL}/apply`,
      method: "post",
      data: data,
    });
  }

  /**
   * 获取项目分页列表
   *
   * @param queryParams 查询参数
   */
  static getPage(queryParams: ProjectPageQuery) {
    return request<any, PageResult<ProjectPageVO[]>>({
      url: `${PROJECT_BASE_URL}/getProjectPage`,
      method: "get",
      params: queryParams,
    });
  }

  /**
   * 根据id获取项目信息
   *
   * @param id 项目ID
   */
  static getById(id: number) {
    return request<any, ProjectPageVO>({
      url: `${PROJECT_BASE_URL}/getById?id=${id}`,
      method: "get",
    });
  }

  /**
   * 删除项目
   *
   * @param id 项目ID
   */
  static deleteById(id: number) {
    return request({
      url: `${PROJECT_BASE_URL}/delete?id=${id}`,
      method: "post",
    });
  }

  /**
   * 根据流程实例id获取项目信息
   *
   * @param workId 流程实例ID
   */
  static getByWorkId(workId: number) {
    return request<any, ProjectData>({
      url: `${PROJECT_BASE_URL}/getByWorkId?workId=${workId}`,
      method: "get",
    });
  }

  /** 项目审批接口*/
  static examine(data: ExamineData) {
    return request({
      url: `${PROJECT_BASE_URL}/examine`,
      method: "post",
      data: data,
    });
  }

  /**
   * 获取立项审批流程节点
   *
   * @param flowId 流程id
   */
  static getFlowNodes() {
    return request<any>({
      url: `${PROJECT_BASE_URL}/getFlowNodes`,
      method: "get",
    });
  }

  /**
   * 获取项目计划树形列表
   *
   * @param projectId 项目ID
   * @returns 菜单树形列表
   */
  static getPlanTree(projectId: number) {
    return request<any, ProjectPlan[]>({
      url: `${PROJECT_BASE_URL}/getPlanTree?projectId=${projectId}`,
      method: "get",
    });
  }

  /** 保存项目计划接口*/
  static saveProjectPlan(projectId: number, plans: any) {
    return request({
      url: `${PROJECT_BASE_URL}/saveProjectPlan?projectId=${projectId}`,
      method: "post",
      data: plans,
    });
  }

  /** 处理项目计划接口*/
  static dealProjectPlan(data: ProjectPlan) {
    return request({
      url: `${PROJECT_BASE_URL}/dealProjectPlan`,
      method: "post",
      data: data,
    });
  }

  /**
   * 获取项目问题分页列表
   *
   * @param queryParams 查询参数
   */
  static getProblemPage(queryParams: ProjectProblemPageQuery) {
    return request<any, PageResult<ProjectProblemPageVO[]>>({
      url: `${PROJECT_BASE_URL}/getProjectProblemPage`,
      method: "get",
      params: queryParams,
    });
  }

  /**
   * 获取问题处理流程节点
   *
   * @param flowId 流程id
   */
  static getProblemFlowNodes() {
    return request<any>({
      url: `${PROJECT_BASE_URL}/getProblemFlowNodes`,
      method: "get",
    });
  }

  /** 问题暂存接口*/
  static problemSave(data: ProjectProblemData) {
    return request({
      url: `${PROJECT_BASE_URL}/problemSave`,
      method: "post",
      data: data,
    });
  }

  /** 问题发起接口*/
  static problemApply(data: ProjectProblemData) {
    return request({
      url: `${PROJECT_BASE_URL}/problemApply`,
      method: "post",
      data: data,
    });
  }

  /**
   * 根据id获取问题信息
   *
   * @param id 问题ID
   */
  static getProblemById(id: number) {
    return request<any, ProjectProblemData>({
      url: `${PROJECT_BASE_URL}/getProblemById?id=${id}`,
      method: "get",
    });
  }

  /**
   * 根据问题处理流程实例id获取问题信息
   *
   * @param workId 流程实例ID
   */
  static getProblemByWorkId(workId: number) {
    return request<any, ProjectProblemData>({
      url: `${PROJECT_BASE_URL}/getProblemByWorkId?workId=${workId}`,
      method: "get",
    });
  }

  /** 问题处理接口*/
  static problemDeal(data: ProjectProblemData) {
    return request({
      url: `${PROJECT_BASE_URL}/problemDeal`,
      method: "post",
      data: data,
    });
  }

  /** 问题验证接口*/
  static problemExamine(data: ExamineData) {
    return request({
      url: `${PROJECT_BASE_URL}/problemExamine`,
      method: "post",
      data: data,
    });
  }
}

export default ProjectAPI;

/** 保存项目请求参数 */
export interface ProjectData {
  /** 主键id */
  id?: number;
  /** 项目编码 */
  projectCode?: string;
  /** 项目名称 */
  projectName?: string;
  /** 项目经理 */
  projectManager?: number;
  /** 产品经理 */
  productManager?: number;
  /** 开发部门 */
  departmentId?: number;
  /** 实际启动时间 */
  beginDate?: string;
  /** 实际结束时间 */
  endDate?: string;
  /** 计划结束时间 */
  planEndDate?: string;
  /** 项目类型 */
  projectType?: number;
  /** 项目类型文字 */
  projectTypeText?: string;
  /** 背景 */
  projectBackground?: string;
  /** 目标 */
  projectTarget?: string;
  /** 风险 */
  projectRisk?: string;
  /** 附件 */
  attachments?: string;
  /** 发起人id */
  creator?: number;
  /** 发起人姓名 */
  userName?: string;
  /** 发起部门 */
  departmentName?: string;
  /** 项目经理姓名 */
  projectManagerName?: string;
  /** 产品经理姓名 */
  productManagerName?: string;
  /** 里程碑 */
  milestones?: [];
  /** 项目组成员*/
  members?: [];
  /** 关联需求*/
  requirements?: [];
}

/** 审批请求参数 */
export interface ExamineData {
  /** 主键id */
  id?: number;
  /** 1-同意，0-驳回 */
  examineStatus?: number;
  /** 意见明细 */
  content?: string;
  /** 工作实例id */
  workId?: number;
  /** 工作进程id */
  processId?: number;
}

/**
 * 项目分页查询对象
 */
 export interface ProjectPageQuery extends PageQuery {
  /** 搜索关键字 */
  projectName?: string;
}

/** 项目分页对象 */
export interface ProjectPageVO {
  /** 主键id */
  id?: number;
  /** 项目编码 */
  projectCode?: string;
  /** 项目名称 */
  projectName?: string;
  /** 项目经理id */
  projectManager?: number;
  /** 产品经理id */
  productManager?: number;
  /** 开发部门 */
  departmentId?: number;
  /** 实际启动时间 */
  beginDate?: string;
  /** 实际结束时间 */
  endDate?: string;
  /** 计划结束时间 */
  planEndDate?: string;
  /** 项目类型 */
  projectType?: number;
  /** 背景 */
  projectBackground?: string;
  /** 目标 */
  projectTarget?: string;
  /** 风险 */
  projectRisk?: string;
  /** 附件 */
  attachments?: string;
  /** 发起人id */
  creator?: number;
  /** 发起人姓名 */
  userName?: string;
  /** 发起部门 */
  departmentName?: string;
  /** 项目经理姓名 */
  projectManagerName?: string;
  /** 产品经理姓名 */
  productManagerName?: string;
  /** 当前阶段 */
  milestoneName?: string;
  /** 阶段里程碑 */
  milestoneDate?: string;
}

/** 项目计划对象 */
export interface ProjectPlan {
  /** 主键id */
  id?: number;
  /** 项目id */
  projectId?: number;
  /** 任务名称 */
  taskName?: string;
  /** 上级任务id */
  parentId?: number;
  /** 责任人id */
  userId?: number;
  /** 责任人昵称 */
  nickName?: string;
  /** 任务排序 */
  groupSeq?: number;
  /** 计划开始时间 */
  beginDate?: string;
  /** 计划完成时间 */
  endDate?: string;
  /** 实际完成时间 */
  realEndDate?: string;
  /** 完成率 */
  completionRate?: number;
  /** 延期原因 */
  delayReason?: string;
  /** 状态：1-未开始，2-进行中，3-发布 */
  status?: number;
  /** 交付物 */
  attachments?: string;
  /** 备注 */
  remark?: string;
}

/** 保存项目问题请求参数 */
export interface ProjectProblemData {
  /** 主键id */
  id?: number;
  /** 项目id */
  projectId?: number;
  /** 问题标题 */
  title?: string;
  /** 问题来源 */
  source?: number;
  /** 问题等级 */
  level?: number;
  /** 问题描述 */
  description?: string;
  /** 期望解决时间 */
  expectTime?: string;
  /** 状态：1-未解决，2-已解决，3-关闭，0-删除 */
  status?: number;
  /** 提出人id */
  creator?: number;
  /** 提出时间 */
  createTime?: string;
  /** 责任人id */
  assigner?: number;
  /** 附件 */
  attachments?: string;
  /** 解决方案 */
  resolveType?: number;
  /** 解决备注 */
  resolveRemark?: string;
  /** 解决时间 */
  resolveTime?: string;
  /** 解决人id */
  resolvePeople?: number;
}

/**
 * 项目问题分页查询对象
 */
export interface ProjectProblemPageQuery extends PageQuery {
  /** 项目id */
  projectId?: number;
  /** 问题标题 */
  title?: string;
  /** 起止时间-起 */
  beginTime?: string;
  /** 起止时间-止 */
  endTime?: string;
}

/** 项目问题分页对象 */
export interface ProjectProblemPageVO {
  /** 主键id */
  id?: number;
  /** 项目id */
  projectId?: number;
  /** 问题标题 */
  title?: string;
  /** 问题来源 */
  source?: number;
  /** 问题等级 */
  level?: number;
  /** 问题描述 */
  description?: string;
  /** 期望解决时间 */
  expectTime?: string;
  /** 状态：1-未解决，2-已解决，3-关闭，0-删除 */
  status?: number;
  /** 提出人id */
  creator?: number;
  /** 提出人昵称 */
  creatorName?: string;
  /** 提出时间 */
  createTime?: string;
  /** 责任人id */
  assigner?: number;
  /** 责任人昵称 */
  assignerName?: string;
  /** 附件 */
  attachments?: string;
  /** 解决方案 */
  resolveType?: number;
  /** 解决备注 */
  resolveRemark?: string;
  /** 解决时间 */
  resolveTime?: string;
  /** 解决人id */
  resolvePeople?: number;
  /** 解决人昵称 */
  aresolveName?: string;
}
